/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

package servlets;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;

import java.util.List;
import java.util.Iterator;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;

import com.csvreader.CsvReader;
import java.nio.charset.Charset;
import java.sql.DriverManager;
import javax.servlet.ServletConfig;
import utils.CargarConfiguraciones;
import utils.respuestaServlet;

/**
 *
 * @author Eduardo Cerritos
 */
public class CargarArchivodBean extends HttpServlet {
   
    private CsvReader reader;
    private Connection conexion;
    private Statement instruccion;

    //Establecer la conexion con la base de datos
    @Override
    public void init (ServletConfig config) throws ServletException{

    //Intentar la conexion y crear instrucciones
        try{
        CargarConfiguraciones cc = new CargarConfiguraciones();
        Class.forName(cc.getValor("driver"));
        conexion =  DriverManager.getConnection(cc.getValor("urlbase"),
                    cc.getValor("usuario"),
                    cc.getValor("clave"));
        //Crear la instruccion
        instruccion = conexion.createStatement();
        }catch(Exception e){
            e.printStackTrace();
        }//end catch


    }


protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
PrintWriter out = response.getWriter();

// obtener el directorio donde guardar temporalmente los archivos
//dirUploadFiles = getServletContext().getRealPath( getServletContext().getInitParameter( "dirUploadFiles" ) );

if( ServletFileUpload.isMultipartContent( request ) ){

 // crear el arhivo factory
  FileItemFactory factory = new DiskFileItemFactory();


 // crear el servlet upload
 ServletFileUpload upload = new ServletFileUpload( factory );
 
 // establecer un tamaÃ±o maximo del archivo
 //upload.setSizeMax( );

 int opcion = 0;
 String materia = "";
 List listUploadFiles = null;
 FileItem item = null;
 FileItem file = null;
 
 try{
     // adquirir la lista de FileItem asociados a la peticion
     listUploadFiles = upload.parseRequest(request);

     // Iterar para obtener todos los FileItem
     Iterator it = listUploadFiles.iterator();
     while( it.hasNext() ){
         item = ( FileItem ) it.next();
         // evaluar si el campo es de tipo file, para subir al servidor
         if( !item.isFormField() ){ //si es el archivo subido
             file = item;
         }
         else{
             String campo = item.getFieldName();
             if(campo.equals("opcion")){
                 String opt = item.getString();
                 opcion = Integer.parseInt(opt);
             }
             if(campo.equals("materia")){
                 materia = item.getString();
             }
         }
     }
     // una vez obtenida la opcion y el archivo proceder a enviar las notas
     // verificamos si el archivo es > 0
     if( file.getSize() > 0 ){
         // obtener el nombre, tipo y extension del archivo
         String nombre   = file.getName();
         String tipo     = file.getContentType();
         String extension = nombre.substring( nombre.lastIndexOf( "." ) );
         // si es un csv valido
         if(tipo.compareTo("text/csv")== 0 || extension.compareToIgnoreCase(".csv") == 0)
         {
//                     // Crear el archivo temporalmente
//                     File archivo = new File( dirUploadFiles, nombre );
//                     item.write( archivo );
//                     // si se guardo recorrerlo para enviar los correos
//                     if ( archivo.exists() )
//                     {
//                        out.println( "GUARDADO " + archivo.getAbsolutePath() + "</p>");
//                        reader = new CsvReader(archivo.getAbsolutePath());

            reader = new CsvReader(file.getInputStream(), Charset.defaultCharset());

            respuestaServlet.imprimirEncabezado(out, "Envio de notas");
            //recorrer el archivo
            while (reader.readRecord())
            {
                String carnet = reader.get(0);
                String evaluacion = reader.get(1);
                String nota = reader.get(2);
                String sql = "SELECT a.email, a.telefono " +
                        "FROM alumno a JOIN alumno_materia am USING(carnet) " +
                        "WHERE a.carnet = '" + carnet + "' and am.codmateria = '" + materia + "'";
                System.out.println(sql);
                ResultSet alumnoRS = instruccion.executeQuery(sql);
                if(alumnoRS.next())//si encontro al alumno mover a ese registro
                {
                    String mensaje = "Su nota en " + materia + " en " + evaluacion + " es de: " + nota;
                    if(opcion == 1 || opcion == 3) // si desea enviar un emai
                    {
                        String email = alumnoRS.getString(1);
                        if(email != null){
                            EnviarNotas.enviarMensaje("Envio de notas", mensaje, email);
                            out.println(carnet + " - " + mensaje + "<br />");
                        }else
                            out.println("El alumno: " + carnet + " no ha ingresado su email al sistema<br />");

                    }
                    if(opcion == 2 || opcion == 3) // si desea enviar un sms
                    {
                        String telefono = alumnoRS.getString(2);
                        if(telefono != null){
                            EnviarNotas.enviarTxt("Notas", mensaje, telefono);
                            out.println(carnet + " - " + mensaje + "<br />");
                        }else
                            out.println("El alumno: " + carnet + " no ha ingresado su telefono celular al sistema<br />");

                    }
                }
                else
                {
                    out.println("El alumno " + carnet + " no esta registrado en la materia y/o el sistema<br />");
                }
            }
            reader.close();
//                     }else{
//                         // nunca se llega a ejecutar
//                         out.println( "FALLO AL GUARDAR. NO EXISTE " + archivo.getAbsolutePath() + "</p>");
//                     }
         }
         else
            out.println("No introdujo un tipo de archivo CSV valido!");
         respuestaServlet.imprimirPie(out);
        }
 }catch( FileUploadException e ){
     e.printStackTrace();
     respuestaServlet.imprimirEncabezado(out, "Envio de notas");
     out.println("Ocurrio un error al cargar su archivo CSV!");
     respuestaServlet.imprimirPie(out);
 }catch (Exception e){
     // poner respuesta = false; si existe alguna problema
     respuestaServlet.imprimirEncabezado(out, "Envio de notas");
     out.println("Ocurrio un error, no se han podido enviar las notas!");
     respuestaServlet.imprimirPie(out);
     e.printStackTrace();
 }
}
out.close();
}

 @Override
    public void destroy()
    {

        try{
            instruccion.close();
            conexion.close();

        }
        catch(SQLException exc)
        {
            exc.printStackTrace();
        }

    }

    @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

    @Override
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
processRequest(request, response);
}

}
